from flask import g, redirect, url_for
from functools import wraps

def login_required(func):
    """
    functools.wraps 是一个装饰器，用于保持被装饰函数的元信息。
    目的：
        在使用装饰器时，原函数的元信息（如函数名、文档字符串等）会被装饰器内部的函数所替代，
        这可能会导致调试和文档生成时的信息丢失。
        使用 @wraps(func) 可以避免这个问题，确保装饰后的函数保留原有函数的信息。
    url_for:
        作用：
            动态生成URL：而不是硬编码URL，可以根据视图函数的名称来生成URL。这样在修改视图函数的路由时，不需要在多个地方更新URL。
            处理参数：可以根据需要传递参数来生成带有查询字符串的URL。
        使用场景：
            在重定向或链接时，使用 url_for 可以确保生成的URL始终是正确的。
            在模板中使用 url_for 可以动态生成指向其他视图的链接。
    :param func:
    :return:
    """
    @wraps(func)
    def inner(*args, **kwargs):
        if hasattr(g, 'user'):
            # 这行代码的作用是调用被装饰的函数 func，并将传递给 inner 函数的所有位置参数和关键字参数都传递给 func。
            return func(*args , **kwargs)
        else:
            #url_for 是Flask提供的一个函数，用于生成应用程序中的URL。它可以根据视图函数的名称和相应的参数生成对应的URL。
            return redirect(url_for("front.login"))
    return inner